package com.study.aop.AspectJAop.基于注解;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author chenhs
 * @date 2019/9/27
 */
@Component/*表示这个类是一个组件*/
@Aspect /*表示这个组件是一个切面类*/
public class MyAspect {
	/*申明一个公用的切入点*/
	@Pointcut("execution(* com.study.aop.AspectJAop.基于注解.UserServiceImpl.*(..)))")
	private  void  myPointCut(){}
	//前置通知  value 中写的是自己定义的切入点，也可以引入已经定义好的切入点。如 后置增强的实例
	
	//@Before(value="execution(* com.study.aop.AspectJAop.基于注解.UserServiceImpl.*(..)))")
	/*切入点申明方式
	*  1：直接申明   value="execution(* com.study.aop.AspectJAop.基于注解.UserServiceImpl.*(..)))"
	*  2：单个引入：value="myPointCut()"
	*  3:多个引入：value="{myPointCut(),myPointCut()2,myPointCut()3,。。。。。。}"
	* */
	public  void befor(JoinPoint point){
		System.out.println("前置增强:"+point.getSignature().getName());
		/*
		*	org.aspectj.lang.JoinPoint;
		* 前置方法的格式 参数一：JoinPoint 用于描述链接点 可以获取链接点方法的方法名等着类值。
		* 、
		*
		* */
	}
	//后置增强
	//@AfterReturning(value = "myPointCut()",returning = "ovj")
	public  void afterRuning(JoinPoint point,Object ovj){
		System.out.println("后置增强"+ovj);
		/*
		* 参数一： org.aspectj.lang.JoinPoint
		* 参数二：类型必须为 Object  ，名称与xml returning标签配置的要一致。
		*
		* */
	}
	//异常增强
	//@AfterThrowing(value = "myPointCut()" ,throwing = "e")
	public  void afterThowing(JoinPoint point,Throwable e){
		System.out.println("异常增强"+e.getMessage());
		/*
		* 格式   org.aspectj.lang.JoinPoint point 这个参数必须填
		* 			Throwable e 必须
		*
		* */
	}
//@Around(value = "myPointCut()" )
	public  Object around(ProceedingJoinPoint point )throws  Throwable{
		System.out.println("换绕增强_前");
		Object proceed = point.proceed();
		System.out.println("换绕增强_后");
		return  proceed;
		/*
		 * 环绕增强
		 *  格式 返回值必须为  Object
		 * 		参数必须为 ： org.aspectj.lang.ProceedingJoinPoint;
		 * 		必须抛出异常
		 * 			  手动执行目标方法
		 
		 * */
	}
	/*最终增强*/
	@After(value = "myPointCut()")
	public  void after(){
		System.out.println("最终增强");
	}
	
}
